/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos.relatorios;

import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.utils.Datas;
import controle.utils.ReportUtils;
import gui.frames.internos.relatorios.IFLogUsuarios;
import java.io.InputStream;
import java.sql.Date;
import java.text.DateFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import modelo.Agente;
import persistencia.dao.AbstractDAO;
import persistencia.session.ConnectionFactory;

/**
 *
 * @author maycon
 */
public class ControleLogUsuarios {

    private IFLogUsuarios frame = null;
    private ApagaElementosDaInterface apaga = new ApagaElementosDaInterface();

    public ControleLogUsuarios(IFLogUsuarios frame) {
        this.frame = frame;
    }

    public void inicializa() {
        frame.getComboUsuarios().setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...", "Agente WHERE idAgente!=1 AND ativo=TRUE", "nome"));

        //Inicializa os botões
        frame.getRadioTodoPeriodo().setSelected(true);
    }

    public void guiAtiva(boolean estado) {
    }

    public void limparGUI() {

        int opcao = JOptionPane.showOptionDialog(null, "Tem certeza que deseja limpar estes campos?", "Limpar",
                JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, frame.botoesOpcoes, frame.botoesOpcoes[0]);

        if (opcao == JOptionPane.YES_OPTION) {
            frame.getComboUsuarios().setSelectedIndex(0);
            frame.getTextCodigoAgente().setText("");
            new ApagaElementosDaInterface().apagaJTextField(frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());

            frame.radioTodoPeriodoActionPerformed(null);
        }
    }

    /**
     * Imprime o relatório
     */
    public boolean imprimir() {

        //Verifica se o usuário inseriu o usuário
        if (frame.getTextCodigoAgente().getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Insira o código do Agente/Usuário.",
                    "Atenção", JOptionPane.WARNING_MESSAGE);
            return false;
        }

        boolean imprime = true;

        try {
            InputStream inputStream = getClass().getResourceAsStream("/LogUsuarios.jasper");
            Map parametros = new HashMap();

            //Define parâmetros de período
            if (frame.getRadioTodoPeriodo().isSelected()) {
                parametros.put("periodo", "Todos");

            } else {

                //Inicializa DateFormat
                DateFormat dataFormatada = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("pt", "BR"));
                Date periodoInicial = Datas.getDate(frame.getTextPeriodoInicial().getText());
                Date periodoFinal = Datas.getDate(frame.getTextPeriodoFinal().getText());
                
                //Verifica se as datas de período não foram preenchidas corretamente e cancela a impressão
                if(periodoInicial == null || periodoFinal == null){
                    JOptionPane.showMessageDialog(frame, "Preencha o período inicial e final corretamente.",
                            "Atenção", JOptionPane.WARNING_MESSAGE);
                    return false;
                }

                if (!periodoFinal.before(periodoInicial)) {
                    parametros.put("periodoInicial", periodoInicial);
                    parametros.put("periodoFinal", periodoFinal);
                    parametros.put("periodo", dataFormatada.format(periodoInicial) + " a " + dataFormatada.format(periodoFinal));

                } else {
                    JOptionPane.showMessageDialog(frame, "A data inicial não pode ser maior do que a data final do período definido.",
                            "Atenção", JOptionPane.WARNING_MESSAGE);
                    imprime = false;
                }
            }

            //Define o parâmetro @nomeUsuario
            parametros.put("codigoAgente", frame.getTextCodigoAgente().getText());

            //Executa o relatório*
            if (imprime) {
                ReportUtils.openReport("Relatório de Log de Usuários", inputStream, parametros, ConnectionFactory.getConnection());
            }

            return true;

        

        } catch (Exception er) {
            JOptionPane.showMessageDialog(null, "Erro ao criar o relatório.\n" + er, "Erro", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }

        return false;

    }

    /**
     * Evento do textField de código de agentes
     */
    public boolean eventoTextCodigoAgentes(JTextField textCodigoAgente, JComboBox comboAgentes, boolean agenteInativo) {

        //Busca o agente pelo código digitado
        List<Agente> age = null;

        //Verifica se o código não foi preenchido
        if(textCodigoAgente.getText().isEmpty()){
            return false;
        }
        
        if (agenteInativo) {
            age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0");
            if (age != null && age.size() > 1) {
                JOptionPane.showMessageDialog(frame, "Existe mais de um agente com este código (inativo), favor selecionar também o nome do agente correto.",
                        "Atenção!", JOptionPane.WARNING_MESSAGE);
            }

        } else {
            age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0  AND ativo=TRUE");

        }

        //Verifica se foi encontrado
        if (age != null && !age.isEmpty()) {
            //Seleciona o comboBox
            comboAgentes.setSelectedItem(age.get(0).getNome());

            return true;
        }

        JOptionPane.showMessageDialog(frame, "Código de agente inexistente ou inativo!", "Atenção!", JOptionPane.WARNING_MESSAGE);
        comboAgentes.setSelectedIndex(0);

        return false;
    }

    /**
     * Evento do combobox com nome dos agentes ativos
     */
    public boolean eventoComboAgentes(JComboBox comboAgentes, JTextField textCodigoAgente) {

        //Verifica se o comoboBox foi selecionado corretamente
        if (comboAgentes.getSelectedIndex() != 0) {

            //Busca o agente
            List<Agente> listAge = this.getListAgente(frame.getComboUsuarios().getSelectedItem().toString());
            if (listAge != null) {

                textCodigoAgente.setText(listAge.get(0).getCodigo().toString());

                return true;
            }

        } else {
            textCodigoAgente.setText("");
        }

        return false;
    }

    /**
     * Busca uma lista de agentes no banco de dados a partir do nome enviado por
     * parâmetro
     */
    protected List<Agente> getListAgente(String nome) {

        List<Agente> listAge = AbstractDAO.consultar("Agente", "nome='" + nome + "'");
        if (listAge.isEmpty()) {
            JOptionPane.showMessageDialog(frame, "Não existe nenhum agente com este nome.", "Agente inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return null;
        }

        return listAge;
    }

    public void eventoRadioTodoPeriodoAction() {
        frame.getRadioTodoPeriodo().setSelected(true);
        frame.getTextPeriodoInicial().setEnabled(false);
        frame.getTextPeriodoFinal().setEnabled(false);
        new ApagaElementosDaInterface().apagaJTextField(frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
    }

    public void eventoRadioDurantePeriodo() {
        frame.getTextPeriodoInicial().setEnabled(true);
        frame.getTextPeriodoFinal().setEnabled(true);
        new ApagaElementosDaInterface().apagaJTextField(frame.getTextPeriodoFinal(), frame.getTextPeriodoInicial());
    }
}
